﻿/*********************************************************************************
 *Description:
 *History:
 Date:    2022.12.16
 Action：Create
 **********************************************************************************/
#pragma once
#ifndef XCLOUDSDK_H
#define XCLOUDSDK_H
#include "XBasic/XSDKPublic.h"
#include "XCloudSDK/XCDevice.h"
#include "XCloudSDK/XCPlay.h"

#ifdef __cplusplus
extern "C"
{
#endif

    /**
     * @brief 设置程序为前台模式（对应后台模式）
     * @param nActive 0：后台；1：前台(激活)
     * @return >=0：成功；<0：失败
     */
    XSDK_API void CALLBACK XCloudSDK_SetActive(int nActive);

    /**
     * @brief XCloudSDK初始化
     * @param sJsonParam 数据内容
     * @return >=0：成功；<0：失败
     */
    XSDK_API int CALLBACK XCloudSDK_Init(const char* sJsonParam);

    /**
     * @brief XCloudSDK反初始化
     * @return
     */
    XSDK_API void CALLBACK XCloudSDK_UnInit();

    /**
     * @brief 设置日志类型和级别
     *
     * @param type: -1: 禁用; 1: 输出到控制台,包括logcat; 2: 输出到文件;
     * @param level: 1: debug; 2: info; 3: warn; 4: error; 5: critical; 6: fatal
     */
    XSDK_API void CALLBACK XCloudSDK_SetLogTypeAndLevel(int type, int level);

#ifdef OS_IOS
    XSDK_API UI_HANDLE CALLBACK XCloudSDK_RegWnd(LP_WND_OBJ pWnd, const char* name = "OnXCloudSDKResult:");
    XSDK_API void CALLBACK XCloudSDK_UnRegWnd(UI_HANDLE hWnd);
#endif

    /**
     * @brief 注册窗口消息
     * @param hWindow 窗口消息通知---通过Message消息
     * @return 用户句柄 >=0：成功；<0：失败
     */
    XSDK_API int CALLBACK XCloudSDK_RegisterWindow(LP_WND_OBJ hWindow);

    /**
     * @brief 注册回调函数
     * @param pMsgCallback 回调函数接收
     * @param pUserData 用户自定义指针，回调函数中返回
     * @return 用户句柄 >=0：成功；<0：失败
     */
    XSDK_API int CALLBACK XCloudSDK_RegisterCallback(PXSDK_MessageCallBack pMsgCallback, void* pUserData);

    /**
     * @brief 销毁注册消息接收
     * @param hUser 用户句柄
     * @return
     */
    XSDK_API void CALLBACK XCloudSDK_UnRegister(int hUser);

    /**
     * @brief 更新鉴权信息
     * @param szPlatUUID        平台客户唯一标志码
     * @param szPlatAppKey      平台应用Key
     * @param szPlatAppSecret   平台应用密钥
     * @param nPlatMovedCard    平台移动取模基数
     * @return >=0：成功；<0：失败
     */
    XSDK_API int CALLBACK XCloudSDK_SetAppParams(const char* szPlatUUID = "",
                                                 const char* szPlatAppKey = "",
                                                 const char* szPlatAppSecret = "",
                                                 int nPlatMovedCard = 0);

    /**
     * @brief 写日志
     * @param szLog 日志内容
     * @return
     */
    XSDK_API void CALLBACK XCloudSDK_Log(const char* szLog);

    /**
     * @brief 初始化一些账户系统需要使用的基础信息
     * @param szInfoJson 参数信息(JSON格式) 参考如下：
     * @example
     * {
     *    "msg" : "at_basic_info"
     *    "useragent" : "", ///< 【可选】用户代理信息，用于记录访问当前服务器的客户标识
     *    "codesize" : "6",  ///< 【可选】服务器下发验证码长度 默认"6"
     *    "language" ： "zh_CN", ///< 【可选】 语言
     *    "region" : "", ///< 【可选】地区
     *    "accesstoken" : "", ///< 【可选】访问令牌信息
     * 【慎用】会覆盖当前账户信息，为了类似于jlink，账户登录不在SDK内部做的客户端使用 "logintype" : "" ///<
     * 【可选】登录类型 通用传"", 第三方传"wx" "fb" "gg" "line"等 【慎用】同上
     * }
     */
    XSDK_API void CALLBACK XCloudSDK_InitBasicInfo(const char* szInfoJson);

    /**
     * @brief 设置服务器默认地址
     * @param szServerKey 服务器Key
     * @param szServerIP [输入]服务器IP或域名，NULL：表示不修改；其它值：修改
     * @param nHttpsPort [输入]默认服务器HTTPS端口，要求>=0
     * @param nHttpPort [输入]默认服务器HTTP端口，要求>=0
     * @return >=0:成功；<0:失败
     */
    XSDK_API int CALLBACK XCloudSDK_SetServerIPAndPort(const char* szServerKey,
                                                       const char* szServerIP,
                                                       int nHttpsPort,
                                                       int nHttpPort);

    /**
     * @brief 设置服务器默认地址
     * @param szServerKey 服务器Key
     * @param szServerUrl
     * [输入]服务器URL地址---格式支持：http://xxx.net或https://xxx.net或http://xxx.net:port或https://xxx.net:port
     * @return >=0:成功；<0:失败
     */
    XSDK_API int CALLBACK XCloudSDK_SetServerAddressByUrl(const char* szServerKey, const char* szServerUrl);

    /**
     * @brief 设置蓝牙设备信息到本地缓存
     * @param szInfoJson 需要设置的蓝牙信息
     * @return
     * 传入的JSON格式：
     * {"DevSn":"","DevHostIP":"192.168.1.1","DevPort":34567}
     */
    XSDK_API void CALLBACK XCloudSDK_SetBluetoothDeviceInfoToLocal(const char* szInfoJson);

    /**
     * @brief 获取版本信息
     * @param szVersion 接收版本信息
     * @return
     */
    XSDK_API char* CALLBACK XCloudSDK_GetVersionInfo(char szVersion[512]);

    /**
     * @brief 切换网络类型
     * @param nNetType 网络类型---EXCLOUDSDK_NETWORKTYPE
     * @return
     * id: 6500 = EXCLOUDSDK_CHANGE_NET_TYPE, 切换网络状态
     * param1: 尝试重连次数
     */
    XSDK_API int CALLBACK XCloudSDK_ChangeNetType(int hUser, int nNetType);

    /**
     * @brief 向服务器查询日志，多用于查询设备电量变化情况
     * @param hUser 用户句柄
     * @param szUrl 查询url
     * @param szReqJson 协议内容
     * @param nTimeout 超时时间
     * @param nSeq 自定义值
     * @return
     * id: 6501 = EXCLOUDSDK_SERVICE_GET_LOGS, 从服务器获取设备日志
     */
    XSDK_API int CALLBACK
    XCloudSDK_SysGetLogs(int hUser, const char* szUrl, const char* szReqJson, int nTimeout = 10000, int nSeq = 0);

    /**
     * @brief 向网关服务器发送请求
     * @param hUser 用户句柄
     * @param szUrl 请求url
     * @param szReqJson 请求内容
     * @param szExInfo 拓展参数(暂未使用)
     * @param nTimeout 超时时间
     * @param nSeq 自定义值
     * @return  EXCLOUDSDK_SERVICE_GATEWAY = 6502,  // 请求网关服务器
     */
    XSDK_API int CALLBACK XCloudSDK_TalkToGateway(int hUser,
                                                  const char* szUrl,
                                                  const char* szReqJson,
                                                  const char* szExInfo = "",
                                                  int nTimeout = 10000,
                                                  int nSeq = 0);

    /**
     * @brief 向AI服务器发送请求
     * @param hUser 用户句柄
     * @param szUrl 请求url
     * @param szReqJson 请求内容
     * @param szExInfo 拓展参数(暂未使用)
     * @param nTimeout 超时时间
     * @param nSeq 自定义值
     * @return  EXCLOUDSDK_SERVICE_AI = 6503,  // 请求AI服务器
     * 注:调用该接口前需要先登录账号获取Accesstoken，或调用XCloudSDK_InitBasicInfo接口主动设置
     */
    XSDK_API int CALLBACK XCloudSDK_TalkToAIServer(int hUser,
                                                   const char* szUrl,
                                                   const char* szReqJson,
                                                   const char* szExInfo = "",
                                                   int nTimeout = 10000,
                                                   int nSeq = 0);

    /**
     * @brief 启用/禁用设备状态查询限制（启用/禁用某种连接方式）
     * @param nStatusType 状态类型，对应EXAccount_DevStatus枚举（目前只支持P2P、RPS、DSS）
     * @param bEnable false:禁用  true:启用（默认所有状态都启用）
     * @return
     * 接口调用后会清空所有设备状态，需要重新查询
     */
    XSDK_API int CALLBACK XCloudSDK_EnableDevStateLimit(int nStatusType, bool bEnable);

    /**
     * @brief 清除本地缓存
     * @param hUser 用户句柄
     * @param nSeq 自定义值
     * @return 回调消息 EXCLOUDSDK_CLEAR_CACHE = 6504   清除本地缓存
	 * 清空之前查询到的设备状态/登出所有设备/清除AccessToken等账号相关的信息/断开MQTT连接
     */
    XSDK_API int XCloudSDK_ClearLocalCache(int hUser, int nSeq);

#ifdef __cplusplus
}
#endif
#endif // XCLOUDSDK_H
